-----Исходное сообщение----- От: Denis Lazebnik Кому: kaev@yandex.ru Дата: 18 марта 2000 г. 11:52 Тема: Идея о новом шаге в MFC Привет! При написании программы на Visual C++ 6.0 я наткнулся на небольшую проблемму и подумал что для её решения можно уделить целый шаг на сайте. Проблемма такова: Скажем у меня самая простая программа SDI и нажатием левой кнопки крысы у меня появляется Modal Dialog в котором введя какую-то строку текста и нажав OK этот текст у меня появляется в окне View. В мой Dialog я хочу добавить кноку Update Now при нажатии которой, текст в окне View обновляется, но сам Dialog не закрывается. Спасибо.
Задача мне понравилась. Спасибо Денис. Вот и давайте её реализуем. Ну во-первых делаем приложение SDI c именем TestOutDialog c помощью AppWizard. Теперь обычные вещи. Делаем диалоговое окно с полем редактирования CEdit и кнопкой Update. Для диалогового окна длеаем класс. Об этом много раз писал как. Называем этот класс CMyDialog. Этот класс унаследует все функции класса CDialog. Теперь некоторые нюансы. Данные должны храниться в классе документа. У нас класс документа называется CTestOutDialogDoc, кроме того класс документа умеет обновлять все виды связанные с ним. Поэтому для реализации необходимой нам кнопки вот чего надо. Надо, чтобы в классе диалога была ссылка на класс документа и тогда ...... . Вот давайте конструктор класса диалога и изменим, и еще сделаем ссылку на класс документа.
#include "TestOutDialogDoc.h"
/////////////////////////////////////////
// CMyDialog dialog
class CMyDialog : public CDialog
{
// Construction
public:
CMyDialog(CTestOutDialogDoc* pD,CWnd* pParent = NULL); // standard constructor
protected:
CTestOutDialogDoc* pDoc;
.........
};
Код конструктора тоже надо изменить. Вот так, чтобы сохранить в диалоге ссылку на документ.
CMyDialog::CMyDialog(CTestOutDialogDoc* pD,CWnd* pParent)
: CDialog(CMyDialog::IDD, pParent)
{
pDoc=pD;
......
}
С этим разобрались. Теперь в любой момент мы будем из класса диалога иметь доступ к классу документа. Давайте займемся нашим полем редактирования. Вы когда-нибудь пробовали к полю редактирования привязать две переменных типа строки и элемента управления. Не пробовали тогда сделайте вот так.

Зачем я это делаю ? Проблема в получении текста из строки редактирования. Единственный гарантированный способ получить текст если завести переменную типа элемент управления и воспользоваться функцией GetWindowText не дожидаясь механизма DDX. А со строкой работать удобнее во всех других случаях. Давайте посмотрим код к кнопке.
void CMyDialog::OnButton1()
{
char buffer[100];
m_Edit.GetWindowText(buffer,sizeof(buffer)); ;
pDoc->str=buffer;
pDoc->UpdateAllViews(NULL);
}
При нажатии на кнопку получаем текст, потом передаем его в класс документа и вызываем функции обновления видов. Теперь нужно создать пункт меню для вызова диалога. Делали, писать не буду. Имя ему New Str. Код нужно, чтобы обрабатывался в классе вида. Тоже писалось. А вот и код.
void CTestOutDialogView::OnTestNewstr()
{
CTestOutDialogDoc* pDoc = GetDocument();
CMyDialog cm(pDoc);
cm.m_Str=pDoc->str;
cm.DoModal()
}
Передаем класс документа. Правда перед выводом на экран передаем переменную из класса документа, в которой хранится строка. Вот её описание.
class CTestOutDialogDoc : public CDocument
{
.......
public:
CString str;
......
};
И начальная инициализация при создании нового документа.
BOOL CTestOutDialogDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
str="Hello MFC";
return TRUE;
}
В классе вида вывод на экран.
void CTestOutDialogView::OnDraw(CDC* pDC)
{
CTestOutDialogDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->;TextOut(10,10,pDoc->str);
}
Идея была рассказана следующая. В класс диалога был передан указатель на класс документа. С помощью этого указателя изменялись данные и обновлялся экран без закрытия диалога.